import _ from 'lodash'

/**
 * 自定义表达式
 */
const expressionOperator = {
  eq(v1, v2) {
    if (!v1) {
      return false
    }
    // 当type=CHECK_BOX时此处应为包含关系
    return Array.isArray(v1) ? v1.includes(+v2) : v1 === +v2
  },
  ne(v1, v2) {
    if (!v1) {
      return false
    }
    return v1 !== +v2
  }
}

/**
 * 逻辑连接符
 *  符号前面留空格 避免拼接时错误
 * @type {{'1': string, '2': string}}
 */
const LogicConnector = {
  1: ' and ',
  2: ' or '
}

/**
 * 获取表达式
 *  @conditionList 条件列表
 *  @connector 连接符 ||或者 &&
 */
export function getExpression(conditionList, connector) {
  const exList = conditionList.filter(item => (Object.keys(item).length !== 0)).map(item => `${item.formItemId} ${item.expression} ${item.optionValue}  `)
  return _.join(exList, LogicConnector[connector])
}

/**
 * 执行表达式是否成立
 */
export function evalExpression(context, expression) {
  const exArray = expression.split(/and|or/)
  // 获取是& 还是|
  const and = expression.indexOf('and') > -1
  let flag = false
  console.log(exArray)
  for (let i = 0; i < exArray.length; i++) {
    const itemExpArr = exArray[i].trim().split(' ')
    console.log(itemExpArr)
    // 截取字段名
    const varName = itemExpArr[0]
    // 条件 等于 不等于
    const sp = itemExpArr[1].trim()
    // 值
    const value = itemExpArr[2]
    // 比较是否成立
    console.log(varName)
    const fieldValue = _.get(context, varName)
    console.log(fieldValue)
    flag = expressionOperator[sp](fieldValue, value)
    console.log(flag)
    // & 一个不成立直接调出循环 返回失败
    if (and && !flag) {
      break
      // | 一个成立直接调出循环 返回成功
    } else if (!and && flag) {
      break
    }
  }
  return flag
}
